package com.qire.manhua.dal;

import com.qire.antsbinder.dal.DataWarehouse.MethodType;
import com.qire.antsbinder.dal.annotation.DataAccess;
import com.qire.antsbinder.dal.annotation.ParamsAlias;
import com.qire.common.constant.Url;
import com.qire.manhua.dal.converter.BooleanToIntConverter;
import com.qire.manhua.dal.converter.PasswordConverter;
import com.qire.manhua.model.vo.AccountAssociatedVerifyVO;
import com.qire.manhua.model.vo.AccountCancellationResultsVO;
import com.qire.manhua.model.vo.AccountCancellationCheckInfoVO;
import com.qire.manhua.model.vo.AccountRelatedInfoVO;
import com.qire.manhua.model.vo.BeanRewardVO;
import com.qire.manhua.model.vo.EvaluationResponseVO;
import com.qire.manhua.model.vo.LoginRespVO;
import com.qire.manhua.model.vo.MobileAuthInfoVO;
import com.qire.manhua.model.vo.MyAccountVO;
import com.qire.manhua.model.vo.OkResponseVO;
import com.qire.manhua.model.vo.UserDetailVO;

/**
 * 用户数据访问
 */
public interface IUserDataDAL {

    /**
     * 刷新用户详细数据接口
     * @return 详细数据
     */
    @DataAccess(url= Url.myIndex, methodType = MethodType.GET)
    UserDetailVO refreshUserDetailData();

    /**
     * 刷新余额
     * @return 账户数据
     */
    @DataAccess(url = Url.account_index)
    MyAccountVO refreshBalanceData();

    /**
     * 获取手机号码验证信息接口调用，是否存在
     * @param phoneNumber 待验证的手机号码
     * @return 手机验证结果信息VO
     */
    @DataAccess(url = Url.v5_mobileAuthInfo)
    MobileAuthInfoVO fetchMobileAuthInfo(@ParamsAlias(name = "tel_phone") String phoneNumber);

    /**
     * 更新用户昵称
     * @param nickname 新用户昵称
     * @return
     */
    @DataAccess(url = Url.v5_nicknameUpdate)
    OkResponseVO updateNickname(@ParamsAlias(name = "user_name") String nickname);

    /**
     * 修改密码接口调用
     * @param phoneNumber   手机账号
     * @param mobilePWD1    新的密码，需要MD5加密
     * @param mobilePWD2    确认密码，需要MD5加密
     * @param validateCode  验证Code，该Code从短信校验接口中获得
     * @param validateType  验证码获取类型，用于告诉服务器，当前的validateCode是通过原密码获得还是通过短信验证码获得，如果是原密码则使用:pwd，如果是使用短信验证码则使用:msgcode
     * @return  修改密码的结果VO
     */
    @DataAccess(url = Url.UpdatePassword)
    OkResponseVO updatePassword(@ParamsAlias(name = "tel_phone") String phoneNumber, @ParamsAlias(name = "mobilepwd") String mobilePWD1,
                                @ParamsAlias(name = "confirmpwd") String mobilePWD2, @ParamsAlias(name = "code_validate") String validateCode,
                                @ParamsAlias(name = "validate_type") String validateType);

    /**
     * 获取验证码接口
     * @param phoneNumber 接受验证码手机号码
     * @return 返回服务器发送结果VO
     */
    @DataAccess(url = Url.FetchVerificationCode, methodType = MethodType.GET)
    OkResponseVO fetchVerificationCode(@ParamsAlias(name = "tel_phone") String phoneNumber);

    /**
     * 校验验证码
     * @param phoneNumber   收到验证码的手机
     * @param verifyCode    收到的验证码
     * @return 验证后的结果VO
     */
    @DataAccess(url = Url.CheckVerificationCode)
    OkResponseVO checkVerificationCode(@ParamsAlias(name = "tel_phone") String phoneNumber, @ParamsAlias(name = "msg_code") String verifyCode);

    /**
     * 通过手机号码注册账号接口
     * @param phoneNumber   电话号码
     * @param mobilePWD     密码，需要MD5加密
     * @param activitySimpleName 注册发生所在的页面类名
     * @return 注册结果VO
     */
    @DataAccess(url = Url.RegisterAccount)
    LoginRespVO registerAccountByPhone(@ParamsAlias(name = "tel_phone") String phoneNumber,
                                       @ParamsAlias(name = "mobilepwd", converter = PasswordConverter.class) String mobilePWD,
                                       @ParamsAlias(name = "login_activity") String activitySimpleName);

    /**
     * 在Alisdk上快速手机登录
     * @param accessToken 阿里SDK返回的token
     * @return
     */
    @DataAccess(url = Url.AliMobileLogin, methodType = MethodType.POST)
    LoginRespVO quickMobileLoginOnAli(@ParamsAlias(name = "access_token") String accessToken);

    /**
     * 请求手机登录
     * @param phoneNumber   手机号码
     * @param mobilePWD     需要md5加密
     * @param activitySimpleName 登录发生的页面
     * @return 接口请求返回VO结果
     */
    @DataAccess(url = Url.MobileLogin)
    LoginRespVO requestMobileLogin(@ParamsAlias(name = "tel_phone") String phoneNumber,
                                   @ParamsAlias(name = "mobilepwd", converter = PasswordConverter.class) String mobilePWD,
                                   @ParamsAlias(name = "login_activity") String activitySimpleName);

    /**
     * 请求微信登录
     * @param openId    用户第三方ID
     * @param userName  用户昵称
     * @param userPortrait 用户头像
     * @param userSex   用户性别
     * @param unionId   联合ID
     * @param activitySimpleName 发起页面
     * @return
     */
    @DataAccess(url = Url.WeChatLogin)
    LoginRespVO requestWeChatLogin(@ParamsAlias(name = "open_id") String openId, @ParamsAlias(name = "user_name") String userName,
                                   @ParamsAlias(name = "user_img") String userPortrait, @ParamsAlias(name = "user_sex") int userSex,
                                   @ParamsAlias(name = "union_id") String unionId, @ParamsAlias(name = "login_activity") String activitySimpleName);

    /**
     * 请求QQ登录
     * @param openId    用户第三方ID
     * @param userName  用户昵称
     * @param userPortrait  用户头像
     * @param userSex   用户性别
     * @param activitySimpleName 发起页面
     * @return
     */
    @DataAccess(url = Url.QqLogin)
    LoginRespVO requestQqLogin(@ParamsAlias(name = "open_id") String openId, @ParamsAlias(name = "user_name") String userName,
                               @ParamsAlias(name = "user_img") String userPortrait, @ParamsAlias(name = "user_sex") int userSex,
                               @ParamsAlias(name = "login_activity") String activitySimpleName);

    /**
     * 设置自动解锁状态接口
     * @param enableAutoPay 是否启用， true ：1 为启用， false : 0 为禁用
     * @return
     */
    @DataAccess(url = Url.v3_mySettingAutoPay)
    OkResponseVO toggleAutoPay(@ParamsAlias(name = "auto_pay", converter = BooleanToIntConverter.class) boolean enableAutoPay);

    /**
     * 上报用户商店评价行为
     * @return
     */
    @DataAccess(url = Url.v3_myEvaluation)
    EvaluationResponseVO markEvaluation();

    /**
     * 领取会员每日奖励
     * @return
     */
    @DataAccess(url = Url.MembersPackageDailyAward)
    BeanRewardVO receiveDailyAward();

    //region #绑定相关接口
    /**
     * 微信绑定
     * @param unionId
     * @param openId
     * @param userName
     * @return
     */
    @DataAccess(url = Url.WeChatBind)
    OkResponseVO weChatBind(@ParamsAlias(name = "union_id") String unionId, @ParamsAlias(name = "open_id") String openId, @ParamsAlias(name = "user_name") String userName);

    /**
     * 微信解绑
     * @param unionId
     * @return
     */
    @DataAccess(url = Url.WeChatUnbind)
    OkResponseVO weChatUnbind(@ParamsAlias(name = "union_id") String unionId);

    /**
     * QQ绑定
     * @param openId
     * @param userName
     * @return
     */
    @DataAccess(url = Url.QqBind)
    OkResponseVO qqBind(@ParamsAlias(name = "open_id") String openId, @ParamsAlias(name = "user_name") String userName);

    /**
     * QQ解绑
     * @param openId
     * @return
     */
    @DataAccess(url = Url.QqUnbind)
    OkResponseVO qqUnbind(@ParamsAlias(name = "open_id") String openId);

    /**
     * 替换绑定的手机号码
     * @param phoneNumber 新手机号码
     * @param verifyCode 短信验证码
     * @return
     */
    @DataAccess(url = Url.ReplaceMobile)
    OkResponseVO replaceBindMobile(@ParamsAlias(name = "tel_phone") String phoneNumber, @ParamsAlias(name = "msg_code") String verifyCode);

    /**
     * 人工更换绑定电话号码接口
     * @param phoneNumber 替换电话
     * @param contactPhone 联系方式 /手机/电话/QQ
     * @param appointmentTime 预约时间段
     * @param reason 替换原因
     * @return
     */
    @DataAccess(url = Url.ArtificialReplaceMobile)
    OkResponseVO artificialReplaceMobile(@ParamsAlias(name = "tel_phone") String phoneNumber, @ParamsAlias(name = "contact_info") String contactPhone,
                                         @ParamsAlias(name = "reserve_time") String appointmentTime, @ParamsAlias(name = "reason") String reason);
    //endregion #绑定相关接口 end

    //region #用户属性编辑接口

    /**
     * 用户属性编辑：昵称
     * @param userName 新的用户名
     * @return
     */
    @DataAccess(url = Url.my_edit_info_ext)
    OkResponseVO submitUserName(@ParamsAlias(name = "user_name") String userName);

    /**
     * 用户属性编辑：头像
     * @param userPortrait 新的用户头像
     * @return
     */
    @DataAccess(url = Url.my_edit_info_ext)
    OkResponseVO submitUserPortrait(@ParamsAlias(name = "user_img") String userPortrait);

    /**
     * 用户属性编辑：性别
     * @param userSex 新的用户性别
     * @return
     */
    @DataAccess(url = Url.my_edit_info_ext)
    OkResponseVO submitUserSex(@ParamsAlias(name = "user_sex") int userSex);

    /**
     * 用户属性编辑：生日
     * @param birthday 新的用户生日
     * @return
     */
    @DataAccess(url = Url.my_edit_info_ext)
    OkResponseVO submitBirthday(@ParamsAlias(name = "birthday") String birthday);

    /**
     * 用户属性编辑：城市索引
     * @param cityIndex 新的用户城市索引
     * @return
     */
    @DataAccess(url = Url.my_edit_info_ext)
    OkResponseVO submitCity(@ParamsAlias(name = "city") int cityIndex);

    //endregion #用户属性编辑接口 end

    //region #账户关联相关接口

    /**
     * 获取账户相关关联列表
     * @return
     */
    @DataAccess(url = Url.AccountRelatedInfoList)
    AccountRelatedInfoVO fetchAccountRelatedInfoList();

    /**
     * 切换关联账户登录
     * @param userId 用户ID
     * @param userHash 用户Hash值，服务器给定
     * @param activityName 登录页面名
     * @return
     */
    @DataAccess(url = Url.AccountToggleLogin)
    LoginRespVO toggleAccount(@ParamsAlias(name = "login_userid") int userId,
                              @ParamsAlias(name = "login_hash") String userHash,
                              @ParamsAlias(name = "login_activity") String activityName);

    /**
     * 关联账户验证
     * @param accountType 1-手机号，2-微信，3-QQ
     * @param accountValue 对应的关键key，如手机号、微信union_id、QQ的openid，它的值取决于 verifyType
     * @return
     */
    @DataAccess(url = Url.AccountAssociatedVerify)
    AccountAssociatedVerifyVO accountAssociatedVerify(@ParamsAlias(name = "asso_type") String accountType, @ParamsAlias(name = "asso_key") String accountValue);

    /**
     * 添加关联账户
     * @param accountType 1-手机号，2-微信，3-QQ
     * @param accountValue 对应的关键key，如手机号、微信union_id、QQ的openid，它的值取决于 verifyType
     * @param userId 用户ID
     * @param userHash 用户Hash值，服务器给定，用于验证
     * @param validateCode 验证码，仅在手机号码类型添加时使用
     * @return
     */
    @DataAccess(url = Url.AccountAssociatedAdd)
    OkResponseVO accountAssociatedAdd(@ParamsAlias(name = "asso_type") String accountType, @ParamsAlias(name = "asso_key") String accountValue,
                                      @ParamsAlias(name = "asso_userid") int userId, @ParamsAlias(name = "asso_userhash") String userHash,
                                      @ParamsAlias(name = "code_validate") String validateCode);

    /**
     * 注销帐户前核对
     * @return
     */
    @DataAccess(url = Url.CheckBeforeCancellationAccount)
    AccountCancellationCheckInfoVO checkBeforeCancellationAccount();

    /**
     * 账户注销
     * @return
     */
    @DataAccess(url = Url.CancellationAccount)
    OkResponseVO accountCancellation();

    /**
     * 人工申诉注销账户接口
     * @param phoneNumber 账户手机号码
     * @param contactPhone 联系方式 /手机/电话/QQ
     * @param appointmentTime 预约时间段
     * @param reason 原因
     * @return
     */
    @DataAccess(url = Url.ArtificialCancellationAccount)
    AccountCancellationResultsVO accountCancellationByArtificial(@ParamsAlias(name = "tel_phone") String phoneNumber, @ParamsAlias(name = "contact_info") String contactPhone,
                                                                 @ParamsAlias(name = "reserve_time") String appointmentTime, @ParamsAlias(name = "reason") String reason);

    /**
     * 查询人工注销账户审核结果
     * @return
     */
    @DataAccess(url = Url.ArtificialCancellationQuery)
    AccountCancellationResultsVO accountCancellationQuery();
    //endregion #账户关联相关接口 end

    //region #修改密码相关接口

    /**
     * 校验原密码
     * @param oldPassword
     * @return
     */
    @DataAccess(url = Url.ValidateOldPassword)
    OkResponseVO validateOldPassword(@ParamsAlias(name = "mobilepwd", converter = PasswordConverter.class) String oldPassword);

    //endregion #修改密码相关接口 end

}
